PaqueterÃa necesaria para el análisis
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2 ✓ purrr 0.3.4
## ✓ tibble 3.0.4 ✓ dplyr 1.0.4
## ✓ tidyr 1.1.2 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(ggrepel)
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
library(heatmaply)
## Loading required package: plotly
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
## Loading required package: viridis
## Loading required package: viridisLite
##
## ======================
## Welcome to heatmaply version 1.2.1
##
## Type citation('heatmaply') for how to cite the package.
## Type ?heatmaply for the main documentation.
##
## The github page is: https://github.com/talgalili/heatmaply/
## Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
## Or contact: <tal.galili@gmail.com>
## ======================
theme_set(ggthemes::theme_fivethirtyeight())
Datos
vgsales <- read_csv("/Users/DavidRojas/Documents/GitHub/proyecto-videojuegos/data/vgsales.csv")
##
## ── Column specification ────────────────────────────────────────────────────────
## cols(
## Rank = col_double(),
## Name = col_character(),
## Platform = col_character(),
## Year = col_character(),
## Genre = col_character(),
## Publisher = col_character(),
## NA_Sales = col_double(),
## EU_Sales = col_double(),
## JP_Sales = col_double(),
## Other_Sales = col_double(),
## Global_Sales = col_double()
## )
vgsales %>%
skimr::skim_without_charts()
| Name | Piped data |
| Number of rows | 16598 |
| Number of columns | 11 |
| _______________________ | |
| Column type frequency: | |
| character | 5 |
| numeric | 6 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| Name | 0 | 1 | 1 | 132 | 0 | 11493 | 0 |
| Platform | 0 | 1 | 2 | 4 | 0 | 31 | 0 |
| Year | 0 | 1 | 3 | 4 | 0 | 40 | 0 |
| Genre | 0 | 1 | 4 | 12 | 0 | 12 | 0 |
| Publisher | 0 | 1 | 3 | 38 | 0 | 579 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 |
|---|---|---|---|---|---|---|---|---|---|
| Rank | 0 | 1 | 8300.61 | 4791.85 | 1.00 | 4151.25 | 8300.50 | 12449.75 | 16600.00 |
| NA_Sales | 0 | 1 | 0.26 | 0.82 | 0.00 | 0.00 | 0.08 | 0.24 | 41.49 |
| EU_Sales | 0 | 1 | 0.15 | 0.51 | 0.00 | 0.00 | 0.02 | 0.11 | 29.02 |
| JP_Sales | 0 | 1 | 0.08 | 0.31 | 0.00 | 0.00 | 0.00 | 0.04 | 10.22 |
| Other_Sales | 0 | 1 | 0.05 | 0.19 | 0.00 | 0.00 | 0.01 | 0.04 | 10.57 |
| Global_Sales | 0 | 1 | 0.54 | 1.56 | 0.01 | 0.06 | 0.17 | 0.47 | 82.74 |
Con base en el resumen de nuestro conjunto de datos:
Se encontraron 5 variables categoricas: - Name: El tÃtulo del videojuego - Genre: El genero al que pertenece dicho titulo - Plataform: Para que plataforma fué publicado el tÃtulo - Publisher: CompañÃa que publica el juego - Developer: Desarolladora del juego
Asà mismo se observan 6 variables numericas: - Rank: El rango con base en el total de ventas correspondiente a cada videojuego - Goblal_Sales: Ventas globales del tÃtulo - NA_sales , EU_Sales, JP_Sales, Other_Sales : Ventas del videojuego por región
Es importante resaltar que aparentemente, el conjunto de datos parece estar relativamente limpio y completo ya que para todas las variables existe un ratio de completitud de 1.
En este resumen tambien se pueden observar estadÃsticos, medidas de posición y tendencia para cada una de las variables numericas, asi como el numero de niveles para las categoricas.
Limpieza de datos
vgsales <- vgsales %>%
filter(Year != "N/A")
Titulos publicados por año
vgsales %>%
mutate(Year = ymd(str_c(Year,"-01-01")) ) %>%
ggplot(aes(x = Year))+
geom_bar(fill = "darkslategray", color = "white")+
scale_x_date(breaks = "3 years",
date_labels = "%Y",
limits = ymd(c("1980-01-01","2020-01-01")))+
theme(axis.text.x = element_text(angle = 45))+
ggtitle("Conteo de titulos publicados por año")
## Warning: Removed 2 rows containing missing values (geom_bar).
Se observa una tendencia creceinte en desarrollo de vieojuegos desde 1982, tomando un máximo entre 2005 y 2007, para decrecer desde ese punto hasta la actualidad. Lo anterior puede ser causado por la consolidación del mercado, es decir se producen menos cantidades porque la industria de desarolladores ya esta mas establecida.
Veamos una gráfica de los mejores desarolladores desde 2006 a 2017
vgsales %>%
group_by(Year,Publisher) %>%
filter(Year > 2005 && Year <2018) %>%
summarise(total_sales = sum(Global_Sales)) %>%
top_n(5) %>%
ggplot(aes(x = Publisher, y = total_sales, fill = Year))+
geom_bar(stat = "identity")+
facet_wrap(~Year,scales = "free_x")+
coord_flip()+
theme(legend.position = "none")+
ggtitle("Mejores desarolladores por año desde 2005")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales
Como se puede observar a pesar que desde 2005 la cantidad de tÃtulos producidos es menor, la mayorÃa de las ventas se encuentran en compañÃas consolidadas de la industria
Ahora, es de interés ver el comportamiento global de ventas por región y genero de los juegos desde 2006 hasta la actualidad.
vgsales %>%
group_by(Year,Genre) %>%
filter(Year>2005 && Year<2018) %>%
summarise(total_sales = sum(Global_Sales)) %>%
top_n(3) %>%
ggplot(aes(x = Genre, y = total_sales , fill = Year))+
geom_bar(stat = "identity")+
facet_wrap(~Year,scales = "free_x")+
coord_flip()+
theme(legend.position = "none")+
ggtitle("Generos con mas ventas por año desde 2005",subtitle = "A nivel global")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales
vgsales %>%
group_by(Year,Genre) %>%
filter(Year>2005 && Year<2018) %>%
summarise(total_sales = sum(EU_Sales)) %>%
top_n(3) %>%
ggplot(aes(x = Genre, y = total_sales , fill = Year))+
geom_bar(stat = "identity")+
facet_wrap(~Year,scales = "free_x")+
coord_flip()+
theme(legend.position = "none")+
ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En Estados Unidos")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales
vgsales %>%
group_by(Year,Genre) %>%
filter(Year>2005 && Year<2018) %>%
summarise(total_sales = sum(JP_Sales)) %>%
top_n(3) %>%
ggplot(aes(x = Genre, y = total_sales , fill = Year))+
geom_bar(stat = "identity")+
facet_wrap(~Year,scales = "free_x")+
coord_flip()+
theme(legend.position = "none")+
ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En Japón")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales
vgsales %>%
group_by(Year,Genre) %>%
filter(Year>2005 && Year<2018) %>%
summarise(total_sales = sum(NA_Sales)) %>%
top_n(3) %>%
ggplot(aes(x = Genre, y = total_sales , fill = Year))+
geom_bar(stat = "identity")+
facet_wrap(~Year,scales = "free_x")+
coord_flip()+
theme(legend.position = "none")+
ggtitle("Generos con mas ventas por año desde 2005",subtitle = "En NA")
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
## Selecting by total_sales
Con lo anterior se puede observar que existen preferencias por ciertos generos de acuerdo a la región, la región de Estados Unidos prefiere los generos de Deportes, Shooters y Acción mientras que la región de Japón predomina el genero de juegos de rol para todos los años.
Como tendencia general a lo largo de los años para todas las regiones los juegos más preferidos son: Deportes, Shooters, Juegos de rol, Miscelaneos y Acción.
Como se observo para cada una de las regiones asi como para los años, el generó provó ser una caracterÃstica significativa, ya que marca las tendecias de las ventas,pero, todavÃa falta comprobarlo estadÃsticamente.
Ahora seleccionaremos uno de los generos que se consideraron predominantes en todo el conjunto de datos para realizar un análisis de ventas, la intención es ajustar un modelo lineal que describa el comportamiento de ventas para cada genero.
Nuestra hipótesis es la siguiente: - H0: El genero y el año no son predictores significativos para las ventas de los videojuegos - H1: El genero y el año son predicores significativos para las ventas de los videojuegos
vgsales_genre <- vgsales %>%
filter(Genre %in% c("Sports","Shooter","Role-Playing","Misc","Action"),
Year > 2007) %>%
select(Year,Global_Sales,Genre) %>%
na.omit() %>%
group_by(Year,Genre) %>%
summarise(total_sales = sum(Global_Sales))
## `summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
vgsales_genre %>%
ggplot(aes(x = ymd(str_c(Year,"-01-01")), y = total_sales, color = Genre))+
geom_point()+
geom_path()+
geom_smooth()+
facet_wrap(~Genre)+
theme(axis.text.x = element_text(angle = 45), legend.position = "none")+
ggtitle("Comportamiento del mercado por generos relevantes")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
vgsales_genre <- vgsales_genre %>%
mutate(Year = as.numeric(Year))
lm(total_sales ~ Genre+ poly(Year,4) ,data = vgsales_genre) # El tercer y cuarto termino del polinomio no es estadisticamente significativo, se eliminan
##
## Call:
## lm(formula = total_sales ~ Genre + poly(Year, 4), data = vgsales_genre)
##
## Coefficients:
## (Intercept) GenreMisc GenreRole-Playing GenreShooter
## 99.77 -58.69 -53.58 -37.56
## GenreSports poly(Year, 4)1 poly(Year, 4)2 poly(Year, 4)3
## -41.28 -182.81 -54.39 -15.36
## poly(Year, 4)4
## -32.21
model <- lm(total_sales ~ Genre+ poly(Year,2) ,data = vgsales_genre)
summary(model)
##
## Call:
## lm(formula = total_sales ~ Genre + poly(Year, 2), data = vgsales_genre)
##
## Residuals:
## Min 1Q Median 3Q Max
## -38.967 -10.216 0.099 12.567 51.641
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 98.798 6.397 15.445 < 2e-16 ***
## GenreMisc -56.998 9.307 -6.124 3.16e-07 ***
## GenreRole-Playing -53.580 9.017 -5.942 5.70e-07 ***
## GenreShooter -35.867 9.307 -3.854 0.000412 ***
## GenreSports -39.594 9.307 -4.254 0.000123 ***
## poly(Year, 2)1 -182.291 20.248 -9.003 3.65e-11 ***
## poly(Year, 2)2 -53.717 20.304 -2.646 0.011599 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.16 on 40 degrees of freedom
## Multiple R-squared: 0.767, Adjusted R-squared: 0.7321
## F-statistic: 21.95 on 6 and 40 DF, p-value: 3.111e-11
pred <-tibble(Year = c(2018,2019,2018,2019,2018,2019,2018,2019,2018,2019),
Genre = c("Sports","Sports","Action","Action","Misc","Misc","Role-Playing","Role-Playing",
"Shooter","Shooter"))
predict(model,pred)
## 1 2 3 4 5 6 7 8
## -27.44045 -51.87853 12.15351 -12.28457 -44.84489 -69.28297 -41.42649 -65.86457
## 9 10
## -23.71378 -48.15186
Como se puede observar el modelo polinomio de segundo grado fué el que mejor desempeño estadÃstico tuvo. Se rechaza la hipótesis nula con base en las pruebas t individuales de los regresores y el estadÃstico F con un p-val menor a 0.05. Es decir, el genero del videojuego y el año son predictores significativos para las ventas.
Sin embargo los valores predecidos para los siguientes años no hacen mucho sentido, debido a que la estructura en general de las ventas presenta una tendencia decreciente desde el año 2006, lo cual es extraño. Es decir, el modelo no es malo, pero, habrÃa que verificar la fiabilidad de los datos comparandolos con otros indicadores de la industria, dado que una tendencia decreciente por mucho tiempo en una industria sólida no hace mucho sentido, y por tanto este fue el mayor problema de la investigación.
regresion<- vgsales %>%
select(Global_Sales,EU_Sales,JP_Sales,NA_Sales,Other_Sales)
regresion<-na.omit(regresion)
heatmaply_cor(
cor(regresion),
k_col = 2,
k_row = 2
)
Haremos un diagrama de barras para ver las ventas que han tenido en cada región y nos daremos cuenta que efectivamente, las ventas del género de Acción son las que predominan en las regiones a excepción de la región de Japón, que tienen mas preferencia al género Role-Playing
vgsales %>%
gather("Region", "Value", c("NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales")) %>%
group_by(Region, Genre) %>%
summarize(Sales = sum(Value)) %>%
top_n(n = 3) %>%
ggplot(aes(x = Region, y = Sales, group = Region, fill = Genre)) +
geom_col(position = "stack") +
scale_fill_viridis(discrete = TRUE) +
labs(title = "Top Género por región")
## `summarise()` has grouped output by 'Region'. You can override using the `.groups` argument.
## Selecting by Sales
Ahora, tambien nos interesa ver el comportamiento de las compañias de desarrollo de videojuegos que ha tenido mayor auge a lo largo del tiempo, usaremos un modelo de serie de tiempo para visualizarlo.
toppub <- vgsales %>%
filter(Publisher %in% c("Electronic Arts", "Activision", "Ubisoft", "Namco Bandai Games", "Nintendo")) %>%
group_by(Publisher, Year) %>%
summarize(total = sum(Global_Sales))
## `summarise()` has grouped output by 'Publisher'. You can override using the `.groups` argument.
vgsales %>%
group_by(Publisher, Year) %>%
summarize(total = sum(Global_Sales)) %>%
ggplot(aes(x = Year, y = total)) +
geom_point(data = toppub, aes(col = Publisher), size = 3.0) +
geom_line(data = toppub, aes(Year,total,group=Publisher,colour=Publisher), size = 1.3) +
geom_path(data = toppub, aes(col = Publisher), size = 1.3)+
scale_color_viridis(discrete = TRUE) +
labs(title = "Serie de tiempo pde ventas por compañia", y = "Ventas en millones")+
theme(axis.text.x = element_text(angle = 90))
## `summarise()` has grouped output by 'Publisher'. You can override using the `.groups` argument.
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
Por último, nos interesa ver en general las consolas que han sido vendidas y las ventas que han generado para ver que efectivamente Nintendo es el que ha tenido mayor densidad en los últimos años.
vgsales %>%
group_by(Platform, Year) %>%
summarize(total = sum(Global_Sales, na.rm = TRUE)) %>%
ggplot(aes(x = Year, y = total, fill = Platform)) +
geom_col(position = "stack") +
labs(y = "Ventas ", title = "Ventas globales por consola") +
scale_fill_viridis(discrete = TRUE)
## `summarise()` has grouped output by 'Platform'. You can override using the `.groups` argument.